Include modifier state in key release events. Fixes bug #453413.
authorRichard Hult <richard@imendio.com>
Tue, 3 Jul 2007 18:49:09 +0000 (18:49 +0000)
committerRichard Hult <rhult@src.gnome.org>
Tue, 3 Jul 2007 18:49:09 +0000 (18:49 +0000)
2007-07-03  Richard Hult  <richard@imendio.com>

* gdk/quartz/gdkevents-quartz.c (create_key_event): Include
modifier state in key release events. Fixes bug #453413.

svn path=/trunk/; revision=18367

ChangeLog
gdk/quartz/gdkevents-quartz.c

index 71305a38e1b8d59d3dc0e16c6613e2b8e71f874f..f4f4008ccafded4d5091a18b41df731cdad062f8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-07-03  Richard Hult  <richard@imendio.com>
+
+       * gdk/quartz/gdkevents-quartz.c (create_key_event): Include
+       modifier state in key release events. Fixes bug #453413.
+
 2007-07-03  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtkcelllayout.c (attributes_text_element): Report
index 4b550380f14ab01858738e95dffd403f9e7cc6d2..7b1bbe300da4779f0515b43f71547d26a55bfca4 100644 (file)
@@ -1461,6 +1461,45 @@ create_key_event (GdkWindow    *window,
 
   event->key.is_modifier = _gdk_quartz_keys_is_modifier (event->key.hardware_keycode);
 
+  /* If the key press is a modifier, the state should include the mask
+   * for that modifier but only for releases, not presses. This
+   * matches the X11 backend behavior.
+   */
+  if (event->key.is_modifier)
+    {
+      int mask = 0;
+
+      switch (event->key.keyval)
+        {
+        case GDK_Meta_R:
+        case GDK_Meta_L:
+          mask = GDK_MOD1_MASK;
+          break;
+        case GDK_Shift_R:
+        case GDK_Shift_L:
+          mask = GDK_SHIFT_MASK;
+          break;
+        case GDK_Caps_Lock:
+          mask = GDK_LOCK_MASK;
+          break;
+        case GDK_Alt_R:
+        case GDK_Alt_L:
+          mask = GDK_MOD5_MASK;
+          break;
+        case GDK_Control_R:
+        case GDK_Control_L:
+          mask = GDK_CONTROL_MASK;
+          break;
+        default:
+          mask = 0;
+        }
+
+      if (type == GDK_KEY_PRESS)
+        event->key.state &= ~mask;
+      else if (type == GDK_KEY_RELEASE)
+        event->key.state |= mask;
+    }
+
   event->key.string = NULL;
 
   /* Fill in ->string since apps depend on it, taken from the x11 backend. */